﻿-- Function: public.timeserial_treedata(integer, integer, integer)

---DROP FUNCTION public.timeserial_treedata(integer, integer, integer);
---分页存储过程
CREATE OR REPLACE FUNCTION public.overpage(
 -- p_schema varchar ='public',
  p_tblname   varchar,       -- 表名
  p_strgetfield varchar = '*',  -- 需要返回的列 
  p_orderfield varchar='',      -- 排序的字段名
  p_pagesize   integer = 10,          -- 页尺寸
  p_pageindex  integer = 1,           -- 页码
  p_ordertype integer = 0,     -- 设置排序类型, 1降序 0升序
  p_strwhere  text = ''  -- 查询条件 (注意: 不要加 where)
  )
  RETURNS json  AS
$BODY$
declare  
  v_strsql text;  
  v_strwhere text;
  v_total  integer;
  v_pagecount integer;
  v_strtmp varchar(1000);
  v_strorder varchar(1000);
  v_data text;
begin   
  if p_strwhere='' or p_strwhere is null then
     v_strwhere := ' 1=1 ';
  else
     v_strwhere := p_strwhere;
  end if;
--以下执行总数统计,计算总数，页数
  v_strsql := 'select count(*) as Total  from ' || p_tblname || ' where ' || v_strwhere ;
  execute v_strsql into v_total;
  v_pagecount := ceil(v_total*1.0/p_pagesize);

--以下计算返回结果集
  v_strsql := '';
  if p_ordertype != 0 then
     v_strtmp := '<(select min' ;
     v_strorder := ' order by ' || p_orderfield || ' desc';
  --如果@OrderType不是0，就执行降序，这句很重要！
  else 
     v_strtmp := '>(select max';
     v_strorder := ' order by ' || p_orderfield || ' asc';
  end if;

  if p_pageindex = 1 then   
     v_strsql := 'select ' || p_strgetfield || ' from ' || p_tblname || ' where ' || v_strwhere || ' ' || v_strorder || ' limit ' || p_pagesize;
 --如果是第一页就执行以上代码，这样会加快执行速度
  else
 --以下代码赋予了@strSQL以真正执行的SQL代码
     v_strsql := 'select ' || p_strgetfield || ' from ' || p_tblname || ' where ' || v_strwhere || ' ' 
       || v_strorder || ' limit ' || p_pagesize || ' offset ' || ((p_pageindex-1)*p_pagesize);
 --    v_strsql := 'select ' || p_strgetfield || ' from '  
 --        || p_tblname || ' where [' || p_orderfield || ']' || v_strtmp || '(['  
 --        || p_orderfield || ']) from (select top ' || ((p_pageindex-1)*p_pagesize) || ' ['  
 --        || p_orderfield || '] from '|| p_tblname || ' where ' || v_strwhere || ' '  
 --        || v_strorder || ') as tblTmp) and ' ||v_strwhere || ' ' || v_strorder ;
  end if;
  v_strsql :='select array_to_json(array_agg(row_to_json(t)))  from ('|| v_strsql ||') t';
  execute v_strsql into v_data;
  -----如果为空改为JSON数组格式
  select COALESCE(v_data, '[]') into v_data;
  v_data := '{"total":"'|| v_total ||'","pagecount":"'|| v_pagecount ||'","data":' || v_data ||'}';

  RETURN v_data::json; 
END;  
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
